Amazon TranscribeがAmazon CloudWatch Eventsに対応しました
Amazonが提供する文字起こしサービス Amazon Transcribe はジョブキューベースで処理します。
これまではジョブの完了イベントはジョブステータスをポーリングしてチェックする必要がありましたが、今後は Amazon CloudWatch イベントルールを利用して、イベントドリブンに通知されるようになりました。
Amazon Transcribe is Now Integrated with AWS CloudTrail and Amazon CloudWatch Events(Jun 28, 2018)
この記事では、Amazon CloudWatch イベントルールを利用し、ジョブ完了後にに文字起こしされたテキストの URL を返す Lambda 関数を実装します。
Amazon Transcribe のイベントについて
2018/07/06時点で Amazon Transcribe のイベントはステート変更("Transcribe Job State Change")だけです。
ジョブステータスが IN_PROGRESS
から
COMPLETED
(文字起こし成功)- (文字起こし失敗)
のどちらかに遷移したときに呼び出されます。
アーキテクチャの概要
Amazon CloudWatch イベントルールで Transcribe のステート変更イベントに対して、Lambda を紐づけています。
(A-1) でユーザーは Transcription ジョブを作成します。
このジョブが完了すると
- CloudWatch Events にイベント発火
- Lambda を呼び出し
- イベント情報をもとに Lambda 関数で Transcription とゴニョゴニョ
します。
Amazon Transcribe 利用可能なリージョンについて
2018/07/06 時点では以下のリージョンで Amazon Transcribe は利用可能です。
- US East (N. Virginia)
- US East (Ohio)
- US West (Oregon)
- EU (Ireland)
対応言語も英語、スペイン語のみです。
東京リージョンや日本語には対応していないため、お気をつけください。
Lambda の実装
"Transcribe Job State Change" のイベント発生時に呼び出され、文字起こしファイルの URL を返す Lambda 関数を Python 3 で実装します。
イベント発生時、Lambda には次の形式の JSON データが渡ります。
{ "version": "0", "id": "event ID", "detail-type":"Transcribe Job State Change", "source": "aws.transcribe", "account": "account ID", "time": "timestamp", "region": "region", "resources": [], "detail": { "TranscriptionJobName": "unique job name", "TranscriptionJobStatus": "status" } }
重要なのは detail のブロックです
- TranscriptionJobName : ジョブ作成時に指定したジョブ名
- TranscriptionJobStatus : COMPLETED(成功) または FAILED(成功)
(ジョブ名, 遷移先ステータス) だけが連携され、文字起こし結果の詳細は含まれていません。 そのため、ジョブ名をキーに GetTranscriptionJob API で詳細情報を取得します。
GetTranscriptionJob
API のレスポンスは次の形式の JSON データで、response['Transcript']
に求める文字起こしファイルの URL が含まれています。
{ "TranscriptionJob": { "CompletionTime": number, "CreationTime": number, "FailureReason": "string", "LanguageCode": "string", "Media": { "MediaFileUri": "string" }, "MediaFormat": "string", "MediaSampleRateHertz": number, "Settings": { "MaxSpeakerLabels": number, "ShowSpeakerLabels": boolean, "VocabularyName": "string" }, "Transcript": { "TranscriptFileUri": "string" }, "TranscriptionJobName": "string", "TranscriptionJobStatus": "string" } }
上記を諸々詰め込んだのが次の Lambda 関数です。
import logging import boto3 logger = logging.getLogger() logger.setLevel(logging.INFO) transcribe = boto3.client('transcribe') def lambda_handler(event, context): logger.info(event) job_name = event['detail']['TranscriptionJobName'] job_status = event['detail']['TranscriptionJobStatus'] if job_status in ['COMPLETED']: # ジョブが成功した場合のみ呼び出す logger.info("COMPLETED") job = transcribe.get_transcription_job(TranscriptionJobName=job_name) logger.info(job) logger.info(job['TranscriptionJob']['Transcript']) return job['TranscriptionJob']['Transcript'] elif job_status in ['FAILED']: # ジョブが失敗した場合の処理は今回は未実装 logger.info("FAILED") pass else: logger.error("Unknown Status Found : {}".format(job_status)) raise Exception
成功した過去のTranscribeジョブをもとにテストイベントを用意して Lambda を実行し、以下のようなレスポンスがかえってくれば成功です。
{ "TranscriptFileUri": "https://s3.amazonaws.com/aws-transcribe-us-east-1-prod/123456789012/unique-job-name/asrOutput.json?X-Amz-Security-Token=..." }
今回は、ジョブ完了後に文字起こしテキストの URL である TranscriptFileUri
だけを返しましたが、本来は、この文字起こし結果をどのようにゴニョゴニョするのかが、サービスの差別化につながるかと思います。
Amazon CloudWatch イベントルール の設定
Event Source
Event Source は次の通り設定します。
- Service Name : Transcribe
- Event Type : Transcribe Job State Change
結果、イベントパターンは
{ "source": [ "aws.transcribe" ], "detail-type": [ "Transcribe Job State Change" ] }
となります。
Targets
Targests に先程作成した Lambda 関数を設定します。
Transcribe ジョブの実行
最後に、なにか音源をもとに Amazon Transcribe ジョブを作成します。
Lambda がエラーなく呼び出され、Lambda の実行ログに TranscriptFileUri
が含まれていれば成功です。
まとめ
今回は Amazon Transcribe のジョブを Amazon CloudWatch イベントルールを使って、イベントドリブンに処理する方法を紹介しました。
- ジョブのワークフロー全体を Amazon Step Functions などで管理
- メッセージキューでジョブの enqueue/dequeue を管理
のようなポーリングベースではなく、イベントドリブンにジョブを処理したい方におすすめです。